package generic_test;
//测试泛型
public class MessageTest {
    public static void main(String[] args) {
/*
        //Impl1 保留了泛型
        IMessage<String> message = new MessageImpl1<>();
        message.print("123");
        IMessage<Integer> message1 = new MessageImpl1<>();
        message1.print(123);
        //Impl2 指定了类型为 String
        IMessage<String> msg2 = new MessageImpl2();
        msg2.print("345");
        */
//        IMessage<Integer> msg3 = new MessageImpl2();
//        msg2.print(34);

//        IMessage<String> msg = new MessageImpl1<>();
//        fun(msg);
//        IMessage<Double> msg1 = new MessageImpl1<>();
      //  fun(msg1);

//        IMessage<String> msg1 = new MessageImpl1<>();
//        msg1.setMsg("老子很帅");
//
//        IMessage<Integer> msg2 = new MessageImpl1<>();
//        msg2.setMsg(18);
//
//        fun(msg1);
//        fun(msg2);

//        fun2(msg1);
//        fun2(msg2);

        IMessage<String> msg1 = new MessageImpl1<>();
        msg1.setMsg("老子很帅");

        IMessage<Integer> msg2 = new MessageImpl1<>();
        msg2.setMsg(18);

        fun3(msg1);
       // fun3(msg2);

    }


    // 此时fun3只能接收String及其父类的对象
    public static void fun3(IMessage<? super String> msg) {
        msg.setMsg("我才是真的帅");
        System.out.println(msg.getMsg());
    }

    public static void fun(IMessage<?> msg){
        //msg.setMsg("阿达阿达");//不能使用set修改
        System.out.println(msg.getMsg());
    }

    // 这个msg仍然可以接收任何类型，但是必须是Number及其子类
    public static void fun2(IMessage<? extends Number> msg) {
        // 不同的子类之间的类型没有任何关系，不能设置值
//        msg.setMsg(10);
        System.out.println(msg.getMsg());
    }

}
